import torch
x=torch.ones(2,2,requires_grad=True)
print(x)
y=x+8
print(y)
z=y*y+8
print(z)
out=z.mean()
print(out)
out.backward()
print("x的grad：{}     x的data:{}".format(x.grad,x.data))

'''当张量的 requires_grad 属性为 True 时，
pytorch会一直跟踪记录此张量的运算
当不需要跟踪计算时，可以通过将代码块包装在 with torch.no_grad(): 上下文中'''
print(x.requires_grad)
print((x ** 2).requires_grad)

with torch.no_grad():
    print((x ** 2).requires_grad)
print(x.requires_grad)
y = x.detach()
print(y.requires_grad)
'''使用 requires_grad_ 就地改变张量此属性'''
a = torch.randn(2, 2)
a = a*3 + 2
print(a.requires_grad)
a.requires_grad_(True)
print(a.requires_grad)



